<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>手写new函数</title>
</head>
<body>
  <script>
    // 自定义构造函数
    function Person(name, age) {
      this.name = name
      this.age = age

      return []
      // return () =>  {}
      // return {m: 1}

      // return null
      // return 2

    }

    // 测试原生new
    const p = new Person('Tom', 12)
    console.log(p)
  </script>

  <script>
    /* 
    实现new函数
    Type: 要创建实例的构造函数
    args: 要传入构造函数的参数列表
    */
    function newInstance(Type, ...args) {
      // 创建一个空object对象
      const obj = {}
      // 给对象添加隐式原型属性__proto__, 值为构造函数Type的显式原型属性prototype
      obj.__proto__ = Type.prototype
      // 调用构造函数Type, 指定this为新建对象, 参数为传入的args
      const result = Type.call(obj, ...args)

      // 如果构造函数返回的结果是引用类型, 最终返回它, 否则返回新对象
      return  result instanceof Object ? result : obj
    }
    const p2 = newInstance(Person, 'Jack', 13)
    console.log(p2)
  </script>
</body>
</html>